/**
 * 函数柯里化， 就是函数的参数还是函数。
 */


function curry(fn) {
    const args1 = Array.prototype.slice.call(arguments, 1)
    return function (){
        const innerArgs= Array.prototype.slice.call(arguments);
        const finalArgs = [...args1, innerArgs]
        return fn.apply(null, finalArgs)
    }
}

function sum(a, b) {
    return a + b
}

// console.log(curry(sum,10));

function  curryV2(fn) {
    const args = Array.prototype.slice.call(arguments,1)
    console.log(args)
    return function () {
        _arg = Array.from(arguments)
        const finArgs = [..._arg, ...args]
        return fn.apply(null, finArgs)
    }
}
// curryV2(sum,1,2, 3)
const cur = curryV2(sum)
// cur(1)(2)(3)



// 计算sum(1)(2)(3)
// 每计算一步， 返回一个函数， 函数后面有参数继续执行
function C3(){
    const oldArgs = [].slice.call(arguments,1)
    return function (){
        const args = [...oldArgs, ...arguments]
        console.log(args)
    }
}
// C3(1)(2)


function C4(){
    let arr = [].slice.call(arguments);
    let fn = function(){
        let arr2 = [].slice.call(arguments);
        return sum.apply(null,arr.concat(arr2));
    }

    fn.toString = function(){
        return arr.reduce((v,n) => v+n);
    }

    return fn;
}

// 这里不管第一个参数是多少， 最后输出的都是第一个参数的number类型值
console.log(["1", "2", "3"].map(parseInt));// [1, NaN, NaN]
console.log(["10", "2", "3"].map(parseInt));// [1, NaN, NaN]
